import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer;

import java.util.Stack;

public abstract class WikiLexerBase extends Lexer {

    public WikiLexerBase(CharStream input) {
        super(input);
    }
    
    public StringBuffer buffer;

    public void 输出(String text){
        buffer.append(text);
    }
    
    public void 输出标题(){
        buffer.append("<title>").append(getText()).append("</title>\r\n");
    }
    
    private int 当前标题等级 = -1;
    private int 标题开始索引 = -1;
    
    public void 标题开始(int 等级){
        buffer.append("<h").append(等级).append(">");
        当前标题等级 = 等级;
        标题开始索引 = getText().length();
    }
    
    public void 标题结束(){
        buffer.append(getText().substring(标题开始索引)).append("</h").append(当前标题等级).append(">\r\n");
    }
    
    private int 加粗开始索引 = -1;
    
    public void 加粗开始(){
        buffer.append("<b>");
        加粗开始索引 = getText().length();
    }
    
    public void 加粗结束(){
        buffer.append(getText().substring(加粗开始索引)).append("</b>");
    }
    

    private int 斜体开始索引 = -1;

    public void 斜体开始(){
        buffer.append("<i>");
        斜体开始索引 = getText().length();
    }

    public void 斜体结束(){
        buffer.append(getText().substring(斜体开始索引)).append("</i>");
    }
    
    private int 地址开始索引 = -1;
    private int 链接标题开始索引= -1;
    
    public void 地址开始(){
        buffer.append("<a href=\"");
        地址开始索引 = getText().length();
    }
    
    public void 地址结束(){
        buffer.append(getText().substring(地址开始索引)).append("\">");
    }
    
    public void 链接标题开始(){
        链接标题开始索引 = getText().length();
    }
    
    public void 链接标题结束(){
        buffer.append(getText().substring(链接标题开始索引)).append("</a>");
    }
    
    private boolean List状态;
    
    public void 开始List(){
        if (List状态) {
            buffer.append("\r\n<li>");
        }else {
            buffer.append("<ul>\r\n<li>");
            List状态 = true;
        }
    }
    
    public void 结束List(){
        if (!List状态) return;
        buffer.append("\r\n");
        List状态 = false;
    }

    boolean 即将结束列() {
        return _input.LA(1)=='|' ||
                (_input.LA(1)=='\n'&&
                        (_input.LA(2)=='-'&&_input.LA(3)=='-')||_input.LA(2)==']');
    }
    
    private int TableDepth;
    
    public void 开始表格(){
        TableDepth++;
    }
    
    public void 结束表格(){
        TableDepth--;
    }
    
    public boolean 是否在表格里(){
        return TableDepth > 0;
    }
    
    
    private int 临时坐标;
    
    public void L(){
        临时坐标 = getText().length();
    }
    
    public void R(){
        输出(getText().substring(临时坐标));
    }
    
}
